1、最接近的三个数之后
思想：3个指针，一个一个遍历
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int ans=nums[0]+nums[1]+nums[2];
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++)
        {
            int start=i+1,end=nums.size()-1;
            while(start<end)
            {
                int sum=nums[i]+nums[start]+nums[end];
                if(abs(target-ans)>abs(target-sum))
                    ans=sum;
                if(sum<target)
                    start++;
                else if(sum>target)
                    end--;
                else
                    return sum;
            }
        }
        return ans;
    }
};

2、四数之和
思想：和3指针思想一样，这里面运到了4个指针，但是得注意一点就是重复得元素得排除，也就是每个指针的相邻元素不能重复
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> vv;
        if(nums.size()<4)
            return vv;
        vector<int> v;
        sort(nums.begin(),nums.end());
        for(int i=0;i<=nums.size()-4;i++)
        {
            //确保第一个不一样
            if(i>0&&nums[i]==nums[i-1])
                continue;
            for(int j=i+1;j<=nums.size()-3;j++)
            {
                //确保第二个数不一样
                if(j>i+1&&nums[j-1]==nums[j])
                    continue;
                int l=j+1,r=nums.size()-1;
                while(l<r)
                {
                    int sum=nums[i]+nums[j]+nums[l]+nums[r];
                    if(sum>target)
                        r--;
                    else if(sum<target)
                        l++;
                    else
                    {
                        v.push_back(nums[i]);
                        v.push_back(nums[j]);
                        v.push_back(nums[l]);
                        v.push_back(nums[r]);
                        vv.push_back(v);
                        v.clear();
                        //确保第三个数不一样
                        while(l<r&&nums[l]==nums[l+1])
                            l++;
                        //确保第四个数不一样
                        while(l<r&&nums[r]==nums[r-1])
                            r--;
                        l++;
                        r--;
                    }
                }
            }
        }
        return vv;
    }
}

3、n对括号的排序
思想：递归加规律，左括号的剩余数目一定小于等于右括号的剩余数目。
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> vv;
        if(nums.size()<4)
            return vv;
        vector<int> v;
        sort(nums.begin(),nums.end());
        for(int i=0;i<=nums.size()-4;i++)
        {
            //确保第一个不一样
            if(i>0&&nums[i]==nums[i-1])
                continue;
            for(int j=i+1;j<=nums.size()-3;j++)
            {
                //确保第二个数不一样
                if(j>i+1&&nums[j-1]==nums[j])
                    continue;
                int l=j+1,r=nums.size()-1;
                while(l<r)
                {
                    int sum=nums[i]+nums[j]+nums[l]+nums[r];
                    if(sum>target)
                        r--;
                    else if(sum<target)
                        l++;
                    else
                    {
                        v.push_back(nums[i]);
                        v.push_back(nums[j]);
                        v.push_back(nums[l]);
                        v.push_back(nums[r]);
                        vv.push_back(v);
                        v.clear();
                        //确保第三个数不一样
                        while(l<r&&nums[l]==nums[l+1])
                            l++;
                        //确保第四个数不一样
                        while(l<r&&nums[r]==nums[r-1])
                            r--;
                        l++;
                        r--;
                    }
                }
            }
        }
        return vv;
    }
};

4、全排列
思想：就是dfs+回溯，for里面遍历每个元素是否都已经用过了
class Solution {
public:
    vector<vector<int>> vv;
    vector<int> v;
    void dfs(vector<int>& nums,vector<int>& book)
    {
        if(v.size()==nums.size())
        {
            vv.push_back(v);
            return;
        }
        //遍历没被使用的元素
        for(int i=0;i<nums.size();i++)
        {
            if(book[i]==0)
            {
                book[i]=1;
                v.push_back(nums[i]);
                dfs(nums,book);
                //回溯
                v.pop_back();
                book[i]=0;
            }
            
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        if(nums.empty())
            return vv;
        vector<int> book(nums.size(),0);
        dfs(nums,book);
        return vv;
    }
};


